// 定义一个数值和字符串的联合类型
let x: [number, string];
x = [123, "123"]
let val: number | string = 123

// 定义一个类型断言
// 第一种 <>
let somevalie: any = "this is a string"
let strlength: number = (<string>somevalie).length
console.log(somevalie, strlength);
// 第二种  as
let somevalie1: any = "this is a string"
let strlength1: number = (somevalie as string).length
console.log(somevalie, strlength);

// 定义一个 void 实现函数的无返回值
function msg(): void {
    console.log("这是");

}
msg()

// 定义一个 never 的函数
function error(message: string): never {
    throw new Error(message)
}

// 分别定义 es5 和 ts 的函数定义
// es5
function add(x: any, y: any) {
    return x + y
}
let myFn = function (x: any, y: any) {
    return x + y
}
// ts
function addFn(x: number, y: number): number { return x + y }

// 定义函数时， 分别实现参数类型、剩余参数、默认参数
function gett(arr: Array<number>, sum: number = 4) {
    console.log(arr, sum);
}
gett([1, 2, 3])
gett([1, 2, 3,], 4)

// 剩余参数
function shenng(firstName: string, ...resName: string[]) {
    console.log(resName);
    return firstName + '' + resName.join('')
}
console.log(shenng('哎哎哎', "aaa"));

// 实现一个函数重载
function getInfo(name: string): string
function getInfo(name: number): number
function getInfo(info: string | number) {
    return info
}
console.log(getInfo('19'));
console.log(getInfo('重载'));

// 使用 es5 的方式定义一个类和es6中定义类
// es6定义
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message
    }
    greet() {
        return "hello" + this.greeting
    }
}
let greeter = new Greeter("word")

// 在 ts 中定义一个类并实现继承
class Zong {
    name: string;
    constructor(name: string) {
        this.name = name
    }
    say() {
        console.log(`hello ${this.name}`);
    }
}
// 继承
class Dog extends Zong { }
const zong = new Zong("hahhh")
zong.say()